package com.dc.designPattern._17_mediator.extend.extend2;

import java.util.Objects;

/**
 * Description: 具体中介者类
 * @author: gdc
 * @date: 2021/6/26
 * @version 1.0
 */
public class ConcreteMediator implements AbstractMediator {

    /**
     * 采购
     */
    private Purchase purchase;
    /**
     * 销售
     */
    private Sale sale;
    /**
     * 库存
     */
    private Stock stock;

    public ConcreteMediator() {
        this.purchase = new Purchase(this);
        this.sale = new Sale(this);
        this.stock = new Stock(this);
    }

    @Override
    public void execute(String operate, Object... objs) {
        if (Objects.equals(operate, "purchase.buy")) {              // 采购电脑
            buyComputer((Integer)objs[0]);
        } else if (Objects.equals(operate, "sale.sell")) {          // 销售电脑
            sellComputer((Integer) objs[0]);
        } else if (Objects.equals(operate, "sale.offsell")) {       // 打折销售
            offSale();
        } else if (Objects.equals(operate, "stock.clear")) {          // 清仓处理
            clearStock();
        }
    }

    /**
     * 采购
     * @param num       采购数量
     */
    private void buyComputer(Integer num) {
        // 获取电脑的销售情况
        int saleStatus = this.sale.getSaleStatus();

        // 根据销售情况，进行采购数量调整（热度>=80, 采购数量：全部；否则采购数量减半）
        if (saleStatus >= 80) {
            System.out.println("采购电脑：" + num + "台");
            this.stock.increase(num);
        } else {
            int buyNum = num / 2;
            System.out.println("采购电脑：" + buyNum + "台");
            this.stock.increase(buyNum);
        }
    }

    /**
     * 销售电脑
     * @param num           销售数量
     */
    private void sellComputer(int num) {
        // 库存不足时，采购补充库存
        if (this.stock.getStockNum() < num) {
            this.purchase.buy(num);
        }

        System.out.println("销售电脑数量：" + num + "台");

        // 减少库存
        this.stock.decrease(num);
    }

    /**
     * 打折处理
     */
    private void offSale() {
        // 获取库存，有多少卖多少
        System.out.println("打折销售电脑数量：" + this.stock.getStockNum());
    }

    /**
     * 清库存
     * 存货压力大了，要去通知采购人员不要采购，销售人员要尽快销售
     */
    public void clearStock() {
        // 要求采购人员，不要采购
        this.purchase.refuseBuy();

        // 要求销售人员折扣销售
        this.sale.offSale();
    }
}
